iT邦幫忙

2022 iThome 鐵人賽

DAY 13
0
Modern Web

傳承D的意志~ 邁向Django的偉大航道系列 第 13

[Day 13] DRF 人(Django Rest framework)! 我的超人(下集)

  • 分享至 

  • xImage
  •  

嗨大家好,我是Sean!
今天接續著昨天,我們來繼續討論關於DRF的細節及用法!

RESTful API


我們昨天已經提過了api,但忘記先說明api是甚麼(尷尬),RESTful api又是甚麼呢?
讓我們來補救一下昨天漏講的部分。

什麼是API?


API (Application Programming Interface),中文翻譯是應用程式介面,
直觀來說,就是應用程式與應用程式之間的溝通橋樑,是不是還是覺得有點抽象?

之前有看過一個關於API的影片簡介,覺得很生動貼切,我把他的連結放在下面,歡迎大家看看!

Yes

那麼,簡單來說,就像影片中所介紹的,如果是一間餐廳是一個網頁程式的話,流程會是這樣的:

首先,進到了餐廳我們第一個看的是,他的菜單!
當我們選好要點甚麼了,我們請服務生來點餐:
第二步,點餐的服務生便會記下我們的點餐內容,並將他轉交給餐廳的內場廚房。
第三步,則是交由廚房製作料理,並且在料理製作完成後,服務生再將料理送餐到我們的餐桌。

這樣的過程,其實與使用API在前後端傳遞資訊的過程大同小異。

  • 菜單 = 前端當前頁面
  • 服務生 = API
  • 廚房 = 後端
  • 上菜的桌面 = 渲染過的前端頁面

這樣一來,有沒有對API有點概念了呢?

那什麼是RESTful API?


REST,其實代表的是Representational State Transfer (表現層狀態轉移)。更精準地來說,它是一種設計風格,而符合這種設計風格的形容詞,就是我們所說的RESTful了!

那麼,RESTful的設計風格又有甚麼特徵呢?

  • 統一介面 Uniform Interface
  • 無狀態 Stateless
  • 與客戶端分離 Client-Server
  1. 統一介面表示統一的api接口,通常為同一個資源來定義URL。
  2. 無狀態表示,在沒有請求的情況為無狀態,在客戶端向server端發起請求時,一併將狀態method傳至server端

這樣的好處有甚麼呢?
最大的特點就是,就是靈活且獨立,可以藉由客戶端請求不同狀態method,來變更API的使用功能。
再來,就是RESTful API不用儲存狀態的緣故,消除了伺服器端的負載,可擴展性便大大提升了。

那麼,讓我們回到DRF本身,介紹一下DRF還有哪些強大方便的使用方法。

又見面了啊 DRF!


除了我們昨天使用過的generics.ListAPIView以外,簡單好用的APIView就還有其他的幾種:

  • Retrieve: get single instance
  • Create: post instance
  • Destroy: delete instance
  • Update: put instance

這樣一來,使用上述幾種APIView配合method,就可以完成關於資料庫CRUD四大基本操作。
除此之外,還有複合式的使用方法,例如ListCreate、RetrieveUpdate等等的使用方法,甚至也可以自己克制化寫出Mixin的model。

但今天我們會再來講第二種關於DRF的使用方法。
上述使用APIView的方法看似簡單,但其中的限制就在於,原本設定時的參數都為單一model。雖然我們也可以依靠其他方法做客制化更改,但還是稍嫌麻煩,讓我們用另一種角度切入寫寫看。

Function Based Views


相較於前面的APIView比較偏向於model based views,
我們這裡來介紹function based views給大家看,不同的寫法卻也可以殊途同歸。

回到專案,在我們寫的view之下增加function based view:

from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status

@api_view(['GET'])
def people_data(request):
    if request.method == 'GET':
        people = People.objects.all()
        serializer = PeopleSerializer(people, many=True)
        
        return Response(serializer.data)

同樣的,再將寫完的API註冊在我們的urls.py裡,值得注意的是,由於我們這裡寫的是function based view,所以步用在url的地方加上.as_view()

python manage.py runserver

開啟網頁,找到我們剛剛寫入的路徑後,便可以看到以下畫面:

https://ithelp.ithome.com.tw/upload/images/20220928/20151096CLh6AIIZsp.png

如此一來就成功啦! 它可以達到的效果跟昨天的view大同小異,但好處在於它有更多的彈性,可以供我們自己客製化。

那麼今天的文章就先到此結束!
我是Sean,你各位海上的人,我們明天見!
https://ithelp.ithome.com.tw/upload/images/20220928/20151096fzHXfTouOx.jpg


上一篇
[Day 12] DRF 人(Django Rest framework)! 我的超人!
下一篇
[Day 14] DRF 再見你最後一面!
系列文
傳承D的意志~ 邁向Django的偉大航道30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言